package com.zxjbyte.yiyi.framework.redis.lock.annotation;

import com.zxjbyte.yiyi.framework.redis.lock.enums.RLockType;

import java.lang.annotation.*;
import java.util.concurrent.TimeUnit;

/**
 * 分布式锁注解
 *
 * @author zhangxingjia
 */
@Target(value = {ElementType.METHOD})
@Retention(value = RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface RLock {

    /**
     * 分布式锁的 key，必须：请保持唯一性
     */
    String key() default "";

    /**
     * 参数支持 spring el
     */
    String[] params() default {};

    /**
     * 获取锁时最多等待的时间 默认取全局配置3秒
     */
    long waitTime() default  -1L;

    /**
     * 锁的最大持有时间 默认取全局配置 30秒
     * 过期时间一定是要长于业务的执行时间
     * 如果过期时间小于业务执行时间，这样会导致业务逻辑还没有完成，锁就被释放了，其他线程就有可能获取到锁并执行业务逻辑，导致数据不一致的问题
     */
    long leaseTime() default -1L;

    /**
     * 时间单位，默认为毫秒
     */
    TimeUnit timeUnit() default TimeUnit.MILLISECONDS;

    /**
     * 默认可重入锁
     */
    RLockType type() default RLockType.Reentrant;

    /**
     * 业务方法执行完后（方法内抛异常也算执行完）自动释放锁，如果为false，锁将不会自动释放直至到达过期时间才释放
     */
    boolean autoRelease() default true;
}
